package ast;

public class ExpLed implements Expresion  {

	/**
	 * ATTRIBUTES
	 */
	// tiempo del delay (en segundos)
	private int _IdVarTiempo;
	// modificador del led
	private boolean _Modificador;
	// id de la variable a activacion
	private int _IdVarUmbral;
	// pin donde se encuentra conectado el elemento
	private int _Pin;
	
	/**
	 * Constructor
	 * @param pPin
	 * @param pIdVarTiempo
	 * @param pModificador
	 * @param pIdVarUmbral
	 */
	public ExpLed( int pPin, int pIdVarTiempo, boolean pModificador, int pIdVarUmbral ){
		_Pin			= pPin;
		_IdVarTiempo 	= pIdVarTiempo;
		_Modificador 	= pModificador;
		_IdVarUmbral 	= pIdVarUmbral;		
	}
	
	/**
	 * Codigo asociado a esta expresion
	 */
	@Override
	public String GenerarCodigo() {
		String code = new String();
		String strVarUmbral = String.valueOf(_IdVarUmbral);
		String strVarTiempo = String.valueOf(_IdVarTiempo);
		String strPin 		= String.valueOf(_Pin);
		// asignacion a var
		code += ConstCode.VAR + strVarUmbral + ConstCode.ASIG_SUMA + ConstCode.FLUJO + ConstCode.FIN_LINE;
		code += ConstCode.IF_EXP + ConstCode.VAR + strVarUmbral + ConstCode.MAYOR + ConstCode.MAX + ConstCode.END_IF_EXP;
		code += ConstCode.FLUJO +  ConstCode.ASIG + ConstCode.VAR + strVarUmbral + ConstCode.RESTA + ConstCode.MAX + ConstCode.FIN_LINE;
		code += ConstCode.VAR + strVarUmbral + ConstCode.ASIG_RESTA + ConstCode.FLUJO + ConstCode.FIN_LINE;
		code += ConstCode.ELSE;
		code += ConstCode.FLUJO +  ConstCode.ASIG + ConstCode.CERO + ConstCode.FIN_LINE;
		code += ConstCode.END_CORCHET;
		// if
		code += ConstCode.IF_EXP + ConstCode.FLUJO + ConstCode.MAYOR + String.valueOf(0) + ConstCode.END_IF_EXP;
		// si la expresion tiene el modificador
		if( _Modificador ){
			code += ConstCode.DIGITAL_WRITE + strPin + ConstCode.COMA + ConstCode.FLUJO + ConstCode.CIERRE_FUNCTION + ConstCode.FIN_LINE;
		} else {
			code += ConstCode.DIGITAL_WRITE + strPin + ConstCode.COMA + ConstCode.HIGH + ConstCode.CIERRE_FUNCTION + ConstCode.FIN_LINE;
		}
		// si la expresion tiene el delay
		if( _IdVarTiempo >= 0 ){
			code += ConstCode.DELAY_FUNCTION + ConstCode.VAR + strVarTiempo + ConstCode.MULTI;
			code += ConstCode.FACTOR_TIME + ConstCode.CIERRE_FUNCTION + ConstCode.FIN_LINE;
		} else {
			code += ConstCode.ELSE;
		}
		code += ConstCode.DIGITAL_WRITE + String.valueOf(_Pin) + ConstCode.COMA + ConstCode.LOW + ConstCode.CIERRE_FUNCTION + ConstCode.FIN_LINE;
		code += ConstCode.END_CORCHET;
		
		/*
		var_Id 	+= flujo;
		flujo 	= var_Id � MAX;
		var_Id 	-= flujo;
		if( flujo > 0 ){
			digitalWrite( pinLed, flujo );
			delay( var_Id*1000 );
			digitalWrite( pinLed, LOW );
			}
		*/
		return code;
	}

	
}